@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion

echo ===========================================
echo       APIViewer 前端启动脚本 (Windows)
echo ===========================================

REM 设置默认值
set DEFAULT_HOST=localhost
set DEFAULT_PORT=3000
set SCRIPT_DIR=%~dp0
set FRONTEND_DIR=%SCRIPT_DIR%frontend

REM 获取命令行参数
set HOST=%DEFAULT_HOST%
set PORT=%DEFAULT_PORT%
set BACKEND_HOST=
set BACKEND_PORT=
set CLEANUP_MODE=false
set REINSTALL_MODE=false
set PRODUCTION_MODE=false

REM 检查是否在正确的目录
if not exist "%FRONTEND_DIR%" (
    echo ❌ 错误: 未找到 frontend 目录
    echo 请确保在项目根目录运行此脚本
    pause
    exit /b 1
)

REM 解析命令行参数
:parse_args
if "%~1"=="" goto :validate_args
if "%~1"=="--host" (
    set HOST=%~2
    shift
    shift
    goto :parse_args
)
if "%~1"=="--port" (
    set PORT=%~2
    shift
    shift
    goto :parse_args
)
if "%~1"=="-h" (
    set HOST=%~2
    shift
    shift
    goto :parse_args
)
if "%~1"=="-p" (
    set PORT=%~2
    shift
    shift
    goto :parse_args
)
if "%~1"=="--backend-host" (
    set BACKEND_HOST=%~2
    shift
    shift
    goto :parse_args
)
if "%~1"=="--backend-port" (
    set BACKEND_PORT=%~2
    shift
    shift
    goto :parse_args
)
if "%~1"=="--cleanup" (
    set CLEANUP_MODE=true
    shift
    goto :parse_args
)
if "%~1"=="--reinstall" (
    set REINSTALL_MODE=true
    shift
    goto :parse_args
)
if "%~1"=="--production" (
    set PRODUCTION_MODE=true
    shift
    goto :parse_args
)
if "%~1"=="--help" (
    call :show_help
    exit /b 0
)
REM 如果只传入了数字，当作端口处理
echo %~1 | findstr /R "^[0-9][0-9]*$" >nul
if %errorlevel% equ 0 (
    set PORT=%~1
    shift
    goto :parse_args
)
REM 如果包含点或冒号，当作主机处理
echo %~1 | findstr /R "\." >nul
if %errorlevel% equ 0 (
    set HOST=%~1
    shift
    goto :parse_args
)
shift
goto :parse_args

:validate_args
REM 验证端口号
set /a PORT_TEST=!PORT! 2>nul
if !PORT_TEST! equ 0 if not "!PORT!"=="0" (
    echo ❌ 错误: 端口号必须是数字，当前值: !PORT!
    pause
    exit /b 1
)

if !PORT! lss 1 (
    echo ❌ 错误: 端口号必须大于0
    pause
    exit /b 1
)

if !PORT! gtr 65535 (
    echo ❌ 错误: 端口号不能超过65535
    pause
    exit /b 1
)

REM 切换到frontend目录
cd /d "%FRONTEND_DIR%"
if %errorlevel% neq 0 (
    echo ❌ 错误: 无法切换到 frontend 目录
    pause
    exit /b 1
)

REM 检查package.json是否存在
if not exist "package.json" (
    echo ❌ 错误: 未找到 package.json 文件
    echo 请确保在正确的项目目录中
    pause
    exit /b 1
)

echo 📍 启动参数:
echo    目录: !CD!
echo    主机: !HOST!
echo    端口: !PORT!
if "!PRODUCTION_MODE!"=="true" (
    echo    模式: 🏗️  生产构建
) else (
    echo    模式: 🛠️  开发模式
)
if not "!PRODUCTION_MODE!"=="true" (
    echo    前端地址: http://!HOST!:!PORT!
)
echo ==========================================

REM 检查端口是否被占用
netstat -an | findstr ":!PORT! " >nul
if !errorlevel! equ 0 (
    echo ⚠️  警告: 端口 !PORT! 可能正在使用中
    echo 如果启动失败，请尝试使用其他端口
    echo.
)

REM 检查Node.js是否安装
REM node --version >nul 2>&1
REM if %errorlevel% neq 0 (
REM     echo Error: Node.js is not installed.
REM     echo Please install it from https://nodejs.org/
REM     pause
REM     exit /b 1
REM )

REM echo ✅ Node.js 版本: 
REM node --version
REM if %errorlevel% neq 0 (
REM     echo Error: Failed to get Node.js version.
REM     pause
REM     exit /b 1
REM )

REM 检查npm是否安装
REM npm --version >nul 2>&1
REM if %errorlevel% neq 0 (
REM     echo Error: npm not found or not working.
REM     pause
REM     exit /b 1
REM )

REM 清理模式
if "!CLEANUP_MODE!"=="true" (
    echo 🧹 正在清理项目...
    if exist "node_modules" rmdir /s /q "node_modules"
    if exist "dist" rmdir /s /q "dist"
    if exist ".webpack" rmdir /s /q ".webpack"
    npm cache clean --force >nul 2>&1
    echo ✅ 清理完成
    echo.
)

REM 重新安装模式
if "!REINSTALL_MODE!"=="true" (
    echo 🔄 重新安装依赖...
    if exist "node_modules" rmdir /s /q "node_modules"
    if exist "package-lock.json" del "package-lock.json"
)

REM 检查依赖是否安装
if not exist "node_modules" (
    echo ⚠️  未找到 node_modules 目录，正在安装依赖...
    npm install
    if !errorlevel! neq 0 (
        echo ❌ 依赖安装失败
        echo 请检查网络连接和npm配置
        pause
        exit /b 1
    )
    echo ✅ 依赖安装完成
    echo.
)

REM 设置API配置
if not "%BACKEND_HOST%"=="" (
    set "REACT_APP_API_HOST=%BACKEND_HOST%"
) else (
    if not defined REACT_APP_API_HOST set "REACT_APP_API_HOST=localhost"
)

if not "%BACKEND_PORT%"=="" (
    set "REACT_APP_API_PORT=%BACKEND_PORT%"
) else (
    if not defined REACT_APP_API_PORT set "REACT_APP_API_PORT=8000"
)

echo 🔧 API配置:
echo    后端主机: !REACT_APP_API_HOST!
echo    后端端口: !REACT_APP_API_PORT!
echo    API地址: http://!REACT_APP_API_HOST!:!REACT_APP_API_PORT!/api
echo.

REM 生产模式构建
if "!PRODUCTION_MODE!"=="true" (
    echo 🏗️  开始生产构建...
    npm run build
    if !errorlevel! neq 0 (
        echo ❌ 生产构建失败
        pause
        exit /b 1
    )
    echo ✅ 生产构建完成
    echo 📁 构建文件位于: !CD!\dist
    pause
    exit /b 0
)

echo 🚀 启动前端开发服务器...
echo 🛑 按 Ctrl+C 停止服务器
echo.

REM 启动webpack开发服务器
set "HOST=!HOST!" && set "PORT=!PORT!" && npx webpack serve --mode development --host !HOST! --port !PORT! --open

if !errorlevel! neq 0 (
    echo.
    echo ❌ 前端服务器启动失败
    echo 💡 可能的解决方案:
    echo    1. 检查端口 !PORT! 是否被占用
    echo    2. 尝试使用其他端口: %~nx0 --port 3001
    echo    3. 清理项目: %~nx0 --cleanup
    echo    4. 重新安装依赖: %~nx0 --reinstall
    pause
    exit /b 1
)

echo.
echo 前端服务器已关闭
pause
exit /b

:show_help
echo 用法: start-frontend.bat [选项]
echo.
echo 选项:
echo   --host, -h HOST          设置前端主机地址 (默认: localhost)
echo   --port, -p PORT          设置前端端口号 (默认: 3000)
echo   --backend-host HOST      设置后端主机地址 (默认: localhost)
echo   --backend-port PORT      设置后端端口号 (默认: 8000)
echo   --cleanup                清理node_modules和缓存
echo   --reinstall              重新安装依赖
echo   --production             生产模式构建
echo   --help                   显示此帮助信息
echo.
echo 示例:
echo   start-frontend.bat
echo   start-frontend.bat --host 0.0.0.0
echo   start-frontend.bat --port 8080
echo   start-frontend.bat --cleanup
echo   start-frontend.bat --production
echo   start-frontend.bat --backend-host 192.168.1.100
echo   start-frontend.bat --backend-port 9000
echo   start-frontend.bat 8080
echo   start-frontend.bat 192.168.1.100
goto :eof 